/**
 * Created by 54614 on 2017/2/9.
 */
(function(angular){
    /*修改数据的就在服务service里操作(就像后台的数据,你前台没法改,写在服务里改成ajax的时候比较好改),
    控制器里不要去修改数据*/
    
    //这个app是这个函数的局部变量,跟其他函数里的app互不影响
    //定义一个子模块
    var app=angular.module('todoApp.service', [])
    //创建一个服务
    //传入$window是为了不让每次都去外面找,会影响效率,$window===window,他是angular
    //给我们封装好的,他会帮我们去拿window对象
    app.service('storageService', function ($window,$filter) {
        //为了不让外界轻易拿到数据,不直接用点属性来储存数据,要让外界调用API(方法)才能拿到数据
        var todoList=angular.fromJson($window.localStorage.getItem('todoList'));
        //拿到数据的方法
        this.getTodo= function () {
            return todoList;
        }
        //保存数据
        this.saveTodo= function () {
            localStorage.setItem('todoList',angular.toJson(todoList))
        }
        //添加数据,由于是添加内容,需要根据输入的text来判断加什么样的数据
        this.addTodo= function (text) {
            //不为空格和空的时候才push
            if(text.length>0){
                todoList.push({id: Math.random(), text:text, isCompleted: false})
            }
            //方法调用模式,this指向调用该方法的对象
            this.saveTodo();
        }
        //删除数据
        this.delTodo= function (item) {
            var idx=todoList.indexOf(item);
            todoList.splice(idx,1);
            this.saveTodo();
        }
        //修改数据
        this.editTodo= function (text) {
            todoList.text=text;
            this.saveTodo();
        }
        //点击checkbox其实也算修改了数据
        this.checkChangeTodo= function () {
            this.saveTodo();
        }
        //全选事件
        this.chooseAllTodo=function(allToggle){
            //参数allToggle可以由监听器中的数据传入
            angular.forEach(todoList, function (val, key) {
                val.isCompleted =allToggle;
            })
            this.saveTodo();
        }
        //清除完成数据事件
        this.clearCompletedTodo= function () {
            //修改数据最好还是在后台(相当于服务里)操作
            /*//将前台的变化的$scope.todoList重新赋给todoList即可
            todoList=$todoList;
            this.saveTodo();*/
            todoList=$filter('filter')(todoList, {isCompleted: false});
            this.saveTodo();
            //因为给todoList重新给了个引用,而前台的$scope.todoList仍然指向原对象,
            // 所以要返回他从而前台可以重新跟他建立联系
            return todoList;
        }
    })
})(angular)